home *** CD-ROM | disk | FTP | other *** search
/ Isometric Game Programming with DirectX 7.0 / Isometric Game Programming.iso / source / chapter18 / isohex18_3 / isoscroller.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-07-28  |  8.1 KB  |  364 lines

  1. //isoscroller.cpp
  2. #include "IsoScroller.h"
  3.  
  4. //constructor
  5. CScroller::CScroller()
  6. {
  7.     //set all spaces to empty
  8.     SetRectEmpty(&rcWorldSpace);
  9.     SetRectEmpty(&rcScreenSpace);
  10.     SetRectEmpty(&rcAnchorSpace);
  11.  
  12.     //set screen anchor to 0,0
  13.     ptScreenAnchor.x=0;
  14.     ptScreenAnchor.y=0;
  15.  
  16.     //set wrapping modes to none
  17.     SetHWrapMode(WRAPMODE_NONE);
  18.     SetVWrapMode(WRAPMODE_NONE);
  19. }
  20.  
  21. //destructor
  22. CScroller::~CScroller()
  23. {
  24. }
  25.  
  26. //screen space
  27. //get screenspace
  28. RECT* CScroller::GetScreenSpace()
  29. {
  30.     //return pointer to rect
  31.     return(&rcScreenSpace);
  32. }
  33.  
  34. //set screenspace
  35. void CScroller::SetScreenSpace(RECT* prcNewScreenSpace)
  36. {
  37.     //copy rectangle
  38.     CopyRect(&rcScreenSpace,prcNewScreenSpace);
  39. }
  40.  
  41. //change screenspace
  42. void CScroller::AdjustScreenSpace(int iLeftAdjust,int iTopAdjust,int iRightAdjust, int iBottomAdjust)
  43. {
  44.     //adjust left
  45.     rcScreenSpace.left+=iLeftAdjust;
  46.     //adjust top
  47.     rcScreenSpace.top+=iTopAdjust;
  48.     //adjust right
  49.     rcScreenSpace.right+=iRightAdjust;
  50.     //adjust bottom
  51.     rcScreenSpace.bottom+=iBottomAdjust;
  52. }
  53.  
  54. //retrieve width of screenspace
  55. int CScroller::GetScreenSpaceWidth()
  56. {
  57.     //return width of rect
  58.     return(rcScreenSpace.right-rcScreenSpace.left);
  59. }
  60.  
  61. //retrieve height of screenspace
  62. int CScroller::GetScreenSpaceHeight()
  63. {
  64.     //return height of rect
  65.     return(rcScreenSpace.bottom-rcScreenSpace.top);
  66. }
  67.  
  68. //world space
  69. //get worldspace
  70. RECT* CScroller::GetWorldSpace()
  71. {
  72.     //return pointer to rect
  73.     return(&rcWorldSpace);
  74. }
  75.  
  76. //set worldspace
  77. void CScroller::SetWorldSpace(RECT* prcNewWorldSpace)
  78. {
  79.     //copy rectangle
  80.     CopyRect(&rcWorldSpace,prcNewWorldSpace);
  81. }
  82.  
  83. //change worldspace
  84. void CScroller::AdjustWorldSpace(int iLeftAdjust,int iTopAdjust,int iRightAdjust, int iBottomAdjust)
  85. {
  86.     //adjust left
  87.     rcWorldSpace.left+=iLeftAdjust;
  88.     //adjust top
  89.     rcWorldSpace.top+=iTopAdjust;
  90.     //adjust right
  91.     rcWorldSpace.right+=iRightAdjust;
  92.     //adjust bottom
  93.     rcWorldSpace.bottom+=iBottomAdjust;
  94. }
  95.  
  96. //retrieve width of worldspace
  97. int CScroller::GetWorldSpaceWidth()
  98. {
  99.     //return width of rect
  100.     return(rcWorldSpace.right-rcWorldSpace.left);
  101. }
  102.  
  103. //retrieve height of worldspace
  104. int CScroller::GetWorldSpaceHeight()
  105. {
  106.     //return height of rect
  107.     return(rcWorldSpace.bottom-rcWorldSpace.top);
  108. }
  109.  
  110. //calc worldspace based on a tileplotter and map width and height
  111. void CScroller::CalcWorldSpace(CTilePlotter* TilePlotter,RECT* prcExtent,int iMapWidth,int iMapHeight)
  112. {
  113.     //set worldspace rect to empty
  114.     SetRectEmpty(&rcWorldSpace);
  115.  
  116.     //temporary rectangle
  117.     RECT rcTemp;
  118.     CopyRect(&rcTemp,prcExtent);
  119.  
  120.     //point for plotting
  121.     POINT ptPlot;
  122.  
  123.     //map point
  124.     POINT ptMap;
  125.  
  126.     //loop through map positions
  127.     for(ptMap.x=0;ptMap.x<iMapWidth;ptMap.x++)
  128.     {
  129.         for(ptMap.y=0;ptMap.y<iMapHeight;ptMap.y++)
  130.         {
  131.             //plot the map point
  132.             ptPlot=TilePlotter->PlotTile(ptMap);
  133.  
  134.             //adjust the temp rect
  135.             OffsetRect(&rcTemp,ptPlot.x,ptPlot.y);
  136.  
  137.             //expand the boundaries of worldspace
  138.             //left
  139.             if(rcTemp.left<rcWorldSpace.left) rcWorldSpace.left=rcTemp.left;
  140.             //top
  141.             if(rcTemp.top<rcWorldSpace.top) rcWorldSpace.top=rcTemp.top;
  142.             //right
  143.             if(rcTemp.right>rcWorldSpace.right) rcWorldSpace.right=rcTemp.right;
  144.             //bottom
  145.             if(rcTemp.bottom>rcWorldSpace.bottom) rcWorldSpace.bottom=rcTemp.bottom;
  146.  
  147.             //adjust the temp rect back
  148.             OffsetRect(&rcTemp,-ptPlot.x,-ptPlot.y);
  149.         }
  150.     }
  151. }
  152.  
  153. //anchor space
  154. //get anchorspace
  155. RECT* CScroller::GetAnchorSpace()
  156. {
  157.     //return pointer to rect
  158.     return(&rcAnchorSpace);
  159. }
  160.  
  161. //set anchorspace
  162. void CScroller::SetAnchorSpace(RECT* prcNewAnchorSpace)
  163. {
  164.     //copy rectangle
  165.     CopyRect(&rcAnchorSpace,prcNewAnchorSpace);
  166. }
  167.  
  168. //change anchorspace
  169. void CScroller::AdjustAnchorSpace(int iLeftAdjust,int iTopAdjust,int iRightAdjust, int iBottomAdjust)
  170. {
  171.     //adjust left
  172.     rcAnchorSpace.left+=iLeftAdjust;
  173.     //adjust top
  174.     rcAnchorSpace.top+=iTopAdjust;
  175.     //adjust right
  176.     rcAnchorSpace.right+=iRightAdjust;
  177.     //adjust bottom
  178.     rcAnchorSpace.bottom+=iBottomAdjust;
  179. }
  180.  
  181. //retrieve width of anchorspace
  182. int CScroller::GetAnchorSpaceWidth()
  183. {
  184.     //return width of rect
  185.     return(rcAnchorSpace.right-rcAnchorSpace.left);
  186. }
  187.  
  188. //retrieve height of anchorspace
  189. int CScroller::GetAnchorSpaceHeight()
  190. {
  191.     //return height of rect
  192.     return(rcAnchorSpace.bottom-rcAnchorSpace.top);
  193. }
  194.  
  195. //calculates anchor space based on world space and screen space
  196. void CScroller::CalcAnchorSpace()
  197. {
  198.     //copy worldspace
  199.     CopyRect(&rcAnchorSpace,&rcWorldSpace);
  200.  
  201.     //subtract out screen space
  202.     if(GetHWrapMode()!=WRAPMODE_WRAP) rcAnchorSpace.right-=GetScreenSpaceWidth();
  203.     if(GetVWrapMode()!=WRAPMODE_WRAP) rcAnchorSpace.bottom-=GetScreenSpaceHeight();
  204.  
  205.     //make sure right!<left and bottom !<top
  206.     if(rcAnchorSpace.right<=rcAnchorSpace.left) rcAnchorSpace.right=rcAnchorSpace.left+1;
  207.     if(rcAnchorSpace.bottom<=rcAnchorSpace.top) rcAnchorSpace.bottom=rcAnchorSpace.top+1;
  208. }
  209.  
  210. //anchor
  211. //retrieve anchor
  212. POINT* CScroller::GetAnchor()
  213. {
  214.     //return screen anchor
  215.     return(&ptScreenAnchor);
  216. }
  217.  
  218. //set anchor
  219. void CScroller::SetAnchor(POINT* pptNewAnchor,bool bWrap)
  220. {
  221.     //copy position
  222.     ptScreenAnchor.x=pptNewAnchor->x;
  223.     ptScreenAnchor.y=pptNewAnchor->y;
  224.  
  225.     //optionally apply wrapping mode
  226.     if(bWrap) WrapAnchor();
  227. }
  228.  
  229. //move anchor
  230. void CScroller::MoveAnchor(int iXAdjust,int iYAdjust,bool bWrap)
  231. {
  232.     //adjust screen anchor
  233.     ptScreenAnchor.x+=iXAdjust;
  234.     ptScreenAnchor.y+=iYAdjust;
  235.  
  236.     //optionally wrap/clip anchor
  237.     if(bWrap) WrapAnchor();
  238. }
  239.  
  240. //apply wrapmode to anchor
  241. void CScroller::WrapAnchor()
  242. {
  243.     //horizontal wrapping
  244.     switch(swmHorizontal)
  245.     {
  246.     case WRAPMODE_CLIP:
  247.         {
  248.             //clip to left
  249.             if(ptScreenAnchor.x<rcAnchorSpace.left) ptScreenAnchor.x=rcAnchorSpace.left;
  250.             //clip to right
  251.             if(ptScreenAnchor.x>=rcAnchorSpace.right) ptScreenAnchor.x=rcAnchorSpace.right-1;
  252.         }break;
  253.     case WRAPMODE_WRAP:
  254.         {
  255.             //left wrapping
  256.             while(ptScreenAnchor.x<rcAnchorSpace.left) ptScreenAnchor.x+=GetAnchorSpaceWidth();
  257.             //right wrapping
  258.             while(ptScreenAnchor.x>=rcAnchorSpace.right) ptScreenAnchor.x-=GetAnchorSpaceWidth();
  259.         }break;
  260.     }
  261.     //vertical wrapping
  262.     switch(swmVertical)
  263.     {
  264.     case WRAPMODE_CLIP:
  265.         {
  266.             //clip to top
  267.             if(ptScreenAnchor.y<rcAnchorSpace.top) ptScreenAnchor.y=rcAnchorSpace.top;
  268.             //clip to bottom
  269.             if(ptScreenAnchor.y>=rcAnchorSpace.bottom) ptScreenAnchor.y=rcAnchorSpace.bottom-1;
  270.         }break;
  271.     case WRAPMODE_WRAP:
  272.         {
  273.             //top wrapping
  274.             while(ptScreenAnchor.y<rcAnchorSpace.top) ptScreenAnchor.y+=GetAnchorSpaceWidth();
  275.             //bottom wrapping
  276.             while(ptScreenAnchor.y>=rcAnchorSpace.bottom) ptScreenAnchor.y-=GetAnchorSpaceWidth();
  277.         }break;
  278.     }
  279. }
  280.  
  281. //conversion
  282. //screen->world
  283. POINT CScroller::ScreenToWorld(POINT ptScreen)
  284. {
  285.     //translate into plotspace coordinates
  286.     ptScreen.x-=rcScreenSpace.left;
  287.     ptScreen.y-=rcScreenSpace.top;
  288.  
  289.     //translate into world coordinates
  290.     ptScreen.x+=ptScreenAnchor.x;
  291.     ptScreen.y+=ptScreenAnchor.y;
  292.  
  293.     //return coordinates
  294.     return(ptScreen);
  295. }
  296.  
  297. //world->screen
  298. POINT CScroller::WorldToScreen(POINT ptWorld)
  299. {
  300.     //translate into plotspace coordinates
  301.     ptWorld.x-=ptScreenAnchor.x;
  302.     ptWorld.y-=ptScreenAnchor.y;
  303.  
  304.     //translate into screen coordinates
  305.     ptWorld.x+=rcScreenSpace.left;
  306.     ptWorld.y+=rcScreenSpace.top;
  307.  
  308.     //return cooridinates
  309.     return(ptWorld);
  310. }
  311.  
  312. //wrap modes
  313. //setters
  314. //horizontal
  315. void CScroller::SetHWrapMode(SCROLLERWRAPMODE ScrollerWrapMode)
  316. {
  317.     //set wrap mode
  318.     swmHorizontal=ScrollerWrapMode;
  319. }
  320.  
  321. //vertical
  322. void CScroller::SetVWrapMode(SCROLLERWRAPMODE ScrollerWrapMode)
  323. {
  324.     //set wrap mode
  325.     swmVertical=ScrollerWrapMode;
  326. }
  327.  
  328. //getters
  329. //horiz
  330. SCROLLERWRAPMODE CScroller::GetHWrapMode()
  331. {
  332.     //return wrap mode
  333.     return(swmHorizontal);
  334. }
  335.  
  336. //vertical
  337. SCROLLERWRAPMODE CScroller::GetVWrapMode()
  338. {
  339.     //return wrap mode
  340.     return(swmVertical);
  341. }
  342.  
  343. //validation
  344. //world
  345. bool CScroller::IsWorldCoord(POINT ptWorld)
  346. {
  347.     //check for valid coordinate
  348.     return(PtInRect(&rcWorldSpace,ptWorld)!=FALSE);
  349. }
  350.  
  351. //screen
  352. bool CScroller::IsScreenCoord(POINT ptScreen)
  353. {
  354.     //check for valid coordinate
  355.     return(PtInRect(&rcScreenSpace,ptScreen)!=FALSE);
  356. }
  357.  
  358. //anchor
  359. bool CScroller::IsAnchorCoord(POINT ptAnchor)
  360. {
  361.     //check for valid coordinate
  362.     return(PtInRect(&rcAnchorSpace,ptAnchor)!=FALSE);
  363. }
  364.